#include "biblioteca.h"

using namespace std;

Biblioteca::Biblioteca():libros(),usuarios(), pedidosUsuario(), pedidosBiblioteca(){

	FicheroDisperso hash();
	cargaUsuarios("usuarios.txt");

}

Usuario Biblioteca::nuevoUsuario(string &alogin, string &anombre, string &aclave, bool &aadmin){
	map<login,Usuario>::iterator it;

	pair<login,Usuario> u;

	Usuario usuario(alogin,anombre,aclave,aadmin);

	if(!usuario.Validar_Clave(alogin))
		throw ErrLogin();
	else{
		u.first = alogin;
		u.second = usuario;

		usuarios.insert(u);
		it = usuarios.find(alogin);

		return (it->second);
	}
}

Usuario* Biblioteca::buscaUsuario(string alogin, string aclave){
	map<login,Usuario>::iterator it;

	it = usuarios.find(alogin);
		return &(it->second);
}

Libro* Biblioteca::buscaLibro(string aisbn){
	pair<isbn,Libro> l;
	map<isbn,Libro>::iterator it;
	libro libro;
	string tit,aut,edi,isbn;
	float prec;
	int anio;

	if((hash.buscar(aisbn,libro))==false){
		throw ErrorLibro();

	}else{
		//devolvemos el libro
		tit=libro.titulo;
		aut=libro.autores;
		edi=libro.editorial;
		anio=libro.anyo;
		isbn=libro.ISBN;
		prec=libro.precioActual;

		//Libro lib_encontrado(tit,aut,edi,anio,isbn,prec);

		//Lo insertamos en libros en memoria
		l.first=isbn;
		//l.second=lib_encontrado;
		libros.insert(l);

		it = libros.find(aisbn);

		return &(it->second);

	}
}

void Biblioteca::cargaUsuarios(string fichero){
	pair<login,Usuario> u;
	ifstream f;
        f.open("usuarios.txt", ifstream::in);
        //fstream f;
   // f.open("usuarios.txt",ios::in | ios::out);
    string login,nombre,clave, aux,vacio;
    bool admin;

   /*if(!f)
        	throw ErrAbrirFich();*/

    while(!f.eof()){
    	getline(f,login);
    	getline(f,nombre);
    	getline(f,clave);
    	getline(f,aux);
    	if(aux == "true"){
    		admin = true;
    	}else{
    		admin = false;
    	}
    	getline(f,vacio);

    	Usuario usuario(login,nombre,clave,admin);
    	        u.first = login;
    	        u.second = usuario;
    	        usuarios.insert(u);
    }

    f.close();
}

PedidoUsuario* Biblioteca::creaPedidoUsuario(Usuario *ausuario, Libro *alibro,int aprioridad){
	PedidoUsuario pedido(ausuario,alibro,aprioridad);

	pedidosUsuario.push_back(pedido);

	return &(*pedidosUsuario.end());
}

PedidoBiblioteca* Biblioteca::abrePedidoBiblioteca(){
	PedidoBiblioteca nuevo;

	pedidosBiblioteca.push_back(nuevo);

	return &(*pedidosBiblioteca.end());
}

void Biblioteca::tramitaPedidoUsuario(PedidoUsuario *pedidoUsuario, PedidoBiblioteca *pedidoBiblioteca){
	pedidoBiblioteca->Inserta_Libro(pedidoUsuario);
	pedidoUsuario->Tramita_Pedido();
}

vector<PedidoUsuario*> Biblioteca::buscaPedidosUsuarioPendientes(Usuario *usuario){
	vector<PedidoUsuario*> listaPedidoAux;
	PedidoUsuario aux;

	for (unsigned int i=0 ; i < pedidosUsuario.size(); ++i){
		aux=pedidosUsuario[i];
		if((aux.Obtener_Usuario()).Obtener_Login() == usuario->Obtener_Login()){
			if(aux.Obtener_Tramitado() == false){
				listaPedidoAux.push_back(&pedidosUsuario[i]);
			}
		}
	}
	return listaPedidoAux;

}

vector<PedidoUsuario*> Biblioteca::buscaPedidosUsuarioTramitados(Usuario *usuario){
	PedidoUsuario aux;
	vector<PedidoUsuario*> listaPedidoAux;

	for (unsigned int i=0 ; i < pedidosUsuario.size(); ++i){
		aux=pedidosUsuario[i];
		if(((aux.Obtener_Usuario()).Obtener_Login() == usuario->Obtener_Login()) && ( (pedidosUsuario[i]).Obtener_Tramitado() == 1 )){
			listaPedidoAux.push_back(&pedidosUsuario[i]);
			}
		}
	return listaPedidoAux;

}

vector<PedidoBiblioteca*> Biblioteca::buscaPedidosBibliotecaPendientes(){
	PedidoBiblioteca aux;
	vector<PedidoBiblioteca*> lista_BibliotecaAux;
	for (unsigned int i=0 ; i < pedidosBiblioteca.size(); ++i){
		aux = pedidosBiblioteca[i];
		if(aux.Obtener_Tramitado() == 0){
			lista_BibliotecaAux.push_back(&pedidosBiblioteca[i]);
			}
		}
	return lista_BibliotecaAux;

}

vector<PedidoBiblioteca*> Biblioteca::buscaPedidosBibliotecaTraminados(){
	PedidoBiblioteca aux;
	vector<PedidoBiblioteca*> lista_BibliotecaAux;
	for (unsigned int i=0 ; i < pedidosBiblioteca.size(); ++i){
		aux = pedidosBiblioteca[i];
		if(aux.Obtener_Tramitado() == 1){
			lista_BibliotecaAux.push_back(&pedidosBiblioteca[i]);
			}
		}
	return lista_BibliotecaAux;

}

void Biblioteca::cierraPedidoBiblioteca(PedidoBiblioteca *pedidoBiblioteca){
	pedidoBiblioteca->Cierra_Pedido();
}

vector<PedidoBiblioteca*> Biblioteca::Vector_PedidosBiblioteca(){
	vector<PedidoBiblioteca*> pedidos;

	for(unsigned int i=0; i < pedidosBiblioteca.size(); i++){
		pedidos.push_back(&pedidosBiblioteca[i]);
	}

	return pedidos;
}

void Biblioteca::Obtener_Libros(){
	map<isbn,Libro>::iterator it = libros.begin();

	 while(it != libros.end()){
        cout << endl;
        cout << "Titulo: " << it->second.Obtener_Titulo() << endl;
		cout << "Autores: " << it->second.Obtener_Autores() << endl;
		cout << "Año: " << it->second.Obtener_Anyo() << endl;
		cout << "Editorial: " << it->second.Obtener_Editorial() << endl;
		cout << "Isbn: " << it->second.Obtener_ISBN() << endl;
		cout << "Precio: " << it->second.Obtener_Precio() << endl;
		it++;
    }
}

void Biblioteca::Obtener_Usuarios(){
	map<login,Usuario>::iterator it = usuarios.begin();

	cout << "Biblioteca contiene " << usuarios.size() << " usuarios" << endl;
	cin.get();

	 while(it != usuarios.end()){
	    	cout <<"----------------------------------------"<< endl;
	        cout << "Login: " << it->second.Obtener_Login() << endl;
	        cout << "Nombre: " << it->second.Obtener_Nombre() << endl;
	        cout << "Clave: " << it->second.Obtener_Clave() <<endl;
	        it++;
	    }
}

void Biblioteca::Obtener_PedidosUsuario(){

	cout << "Biblioteca contiene " << pedidosUsuario.size() << " pedidos de usuarios" << endl;
	cin.get();

	for(unsigned int i=0; i< pedidosUsuario.size();i++){
	    	cout << endl;
	        cout << "Usuario: " << (pedidosUsuario[i].Obtener_Usuario()).Obtener_Nombre() << endl;
	       // cout << "Libro: " << (pedidosUsuario[i].Obtener_Libro()).Obtener_Titulo() << endl;
	        cout << "Precio: " << pedidosUsuario[i].Ver_Precio() << endl;
	        cout << "Fecha: " << pedidosUsuario[i].Obtener_Fecha() << endl;
	        cout << "Prioridad: " << pedidosUsuario[i].Obtener_Prioridad() <<endl;
	        cout << "Tramitado: " << pedidosUsuario[i].Obtener_Tramitado() << endl << endl;
	}
}


void Biblioteca::Obtener_PedidosBiblioteca(){

	cout << "Biblioteca contiene " << pedidosBiblioteca.size() << " pedidos de biblioteca" << endl;
	cin.get();

	for(unsigned int i=0; i< pedidosBiblioteca.size();i++){
		    cout << endl;
		    cout << "Fecha: " << pedidosBiblioteca[i].Obtener_Fecha() << endl;
		    cout << "Importe: " << pedidosBiblioteca[i].Obtener_Importe() << endl;
		    cout << "Tramitado: " << pedidosBiblioteca[i].Obtener_Tramitado() << endl << endl;
	}
}
